#include <VirtualWire.h>  // you must download and install the VirtualWire.h to your hardware/libraries folder

const int steeringInput = A0;  // Analog input pin that the steering potentiometer is attached to
const int speedInput = A1;  // Analog input pin that the speed potentiometer is attached to

const int partidaInput = 4; // Chave de partida
const int partidaLed = 2; // Chave de partida LED
const int farolBaixoInput = 5; // Farol baixo
const int farolBaixoLed = 9; // Farol baixo LED
const int farolAutomaticoInput = 6; // Farol automático
const int farolAutomaticoLed = A2; // Farol automático LED
const int farolAltoInput = 7; // Farol alto
const int farolAltoLed = 11; // Farol alto LED
const int alertaInput = 8; // Alerta
const int alertaLed = 12; // Alerta LED

// Variáveis para captura das leituras dos potenciômetros de controle
volatile unsigned long steeringValue = 511;
volatile unsigned long speedValue = 511;

// Variável de 32-bit para envio de dados ao controlador do trator
unsigned long messageValue = 0;

// DEBUG VARS
long debug;
// END DEBUG VARS

void setup()
{
  pinMode(partidaInput,INPUT_PULLUP);
  pinMode(farolBaixoInput,INPUT_PULLUP);
  pinMode(farolAutomaticoInput,INPUT_PULLUP);
  pinMode(farolAltoInput,INPUT_PULLUP);
  pinMode(alertaInput,INPUT_PULLUP);

  // Initialize IO pins
  pinMode(partidaLed, OUTPUT);
  pinMode(farolBaixoLed, OUTPUT);
  pinMode(farolAutomaticoLed, OUTPUT);
  pinMode(farolAltoLed, OUTPUT);
  pinMode(alertaLed, OUTPUT);
  
  // Initialise the IO and ISR
  vw_set_ptt_inverted(true); // Required for RF Link module
  vw_setup(2000);            // Bits per sec
  vw_set_tx_pin(3);          // pin 3 is used as the transmit data out into the TX Link module, change this to suit your needs. 
}

void loop()
{
  // Realiza a leitura dos potenciômetros
  steeringValue = analogRead(steeringInput);
  speedValue = analogRead(speedInput);
  
  // Adiciona valores lidos ao corpo da mensagem
  messageValue = (((steeringValue<<10)&0xFFC00) + (speedValue&0x3FF));

  Serial.println("------------------------------------------------------------------");

  // Realiza a leitura das entradas digitais
  if(!digitalRead(partidaInput)) // Chave de partida
  {
    messageValue = messageValue | 0x80000000;
    digitalWrite(partidaLed, HIGH);
    Serial.println("Chave de partida ON!");
  }
  else
  {
    messageValue = messageValue & 0x7FFFFFFF;
    digitalWrite(partidaLed, LOW);
    Serial.println("Chave de partida OFF!");
  }
  
  if(!digitalRead(farolBaixoInput)) // Farol baixo
  {
    messageValue = messageValue | 0x40000000;
    digitalWrite(farolBaixoLed, HIGH);
    Serial.println("Farol baixo ON!");
  }
  else
  {
    messageValue = messageValue & 0xBFFFFFFF;
    digitalWrite(farolBaixoLed, LOW);
    Serial.println("Faro baixo OFF!");
  }

  if(!digitalRead(farolAutomaticoInput)) // Farol automático
  {
    messageValue = messageValue | 0x20000000;
    digitalWrite(farolAutomaticoLed, HIGH);
    Serial.println("Farol automatico ON!");
  }
  else
  {
    messageValue = messageValue & 0xDFFFFFFF;
    digitalWrite(farolAutomaticoLed, LOW);
    Serial.println("Farol automatico OFF!");
  }
  
  if(!digitalRead(farolAltoInput)) // Farol alto
  {
    messageValue = messageValue | 0x10000000;
    digitalWrite(farolAltoLed, HIGH);
    Serial.println("Farol alto ON!");
  }
  else
  {
    messageValue = messageValue & 0xEFFFFFFF;
    digitalWrite(farolAltoLed, LOW);
    Serial.println("Farol alto OFF!");
  }
  
  if(!digitalRead(alertaInput)) // Alerta
  {
    messageValue = messageValue | 0x8000000;
    digitalWrite(alertaLed, HIGH);
    Serial.println("Alerta ON!");
  }
  else
  {
    messageValue = messageValue & 0xF7FFFFFF;
    digitalWrite(alertaLed, LOW);
    Serial.println("Alerta OFF!");
  }
  
  // DEBUG
  Serial.print("Message Value: ");
  Serial.print(messageValue);
  Serial.println();
  Serial.print("Steering Value: ");
  Serial.print(steeringValue);
  Serial.println();
  Serial.print("Speed Value: ");
  Serial.print(speedValue);
  Serial.println();
  // END DEBUG

  // Inicia o envio dos dados
  vw_send((uint8_t *)&messageValue, sizeof(messageValue));
  vw_wait_tx();   // Wait for message to finish
  Serial.print("Mensagem enviada!");
  Serial.println("------------------------------------------------------------------");
  Serial.println();
  
  delay(2000);
}
